package moodle.Org;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

import dao.GerenciaCurso;
import jamder.Environment;
import jamder.Organization;
import jamder.roles.AgentRole;
import jamder.roles.ModelAgentRole;
import jamder.roles.ProactiveAgentRole;
import jamder.agents.GenericAgent;
import moodle.Agentes.*;
import moodle.dados.Aluno;
import moodle.dados.Atividade;
import moodle.dados.Curso;
import moodle.dados.grupos.Grupo;
import moodle.dados.mensagem.Mensagem;

public class MoodleEnv extends Environment {
	
	private GerenciaCurso gerenciadorCurso;
	private ExecutorService executorThread;
	private GerenciadorBeans gerenciadorBeans;
	private boolean mantemAgentesAtivos;
	private List<Mensagem> mensagens;
	private List<Grupo> grupos;
	private Map<Curso, List<Aluno>> alunosNotaBaixa;
	private Map<Aluno, List<Atividade>> atividadesEncerrando;
	
	public MoodleEnv (String name, String host, String port) {
	    super(name, host, port);
	    
	    mantemAgentesAtivos = false;
	    
	    Organization MoodleOrg = new Organization("MoodleOrg", this, null);
		addOrganization("MoodleOrg", MoodleOrg);
		
		
		GenericAgent CompanheiroAg = new CompanheiroAgente("CompanheiroAg", this, null);
	    AgentRole CompanheiroAgRole = new ModelAgentRole("CompanheiroAgRole", MoodleOrg, CompanheiroAg); 
	    addAgent("CompanheiroAg", CompanheiroAg); 
		
		GenericAgent FormadorAg = new FormadorAgente("FormadorAg", this, null);
	    AgentRole FormadorAgRole = new ProactiveAgentRole("FormadorAgRole", MoodleOrg, FormadorAg); 
	    addAgent("FormadorAg", FormadorAg);
		
	    GenericAgent AcompanhanteTutorAg = new AcompanhanteTutorAgente("AcompanhanteTutorAg", this, null);
	    AgentRole AcompanhanteTutorAgRole = new ModelAgentRole("AcompanhanteTutorAgRole", MoodleOrg, AcompanhanteTutorAg); 
	    addAgent("AcompanhanteTutorAg", AcompanhanteTutorAg);
	    
		//GenericAgent PedagogicoAg = new PedagogicoAgente("PedagogicoAg", this, null);
	    //AgentRole PedagogicoAgRole = new ProactiveAgentRole("PedagogicoAgRole", MoodleOrg, PedagogicoAg); 
	    //addAgent("PedagogicoAg", PedagogicoAg);   
	    
		
		
		
		
	    //GenericAgent AjudanteAg = new AjudanteAgente("AjudanteAg", this, null);
		//AgentRole AjudanteAgRole = new AgentRole("AjudanteAgRole", MoodleOrg, AjudanteAg); 
	    //addAgent("AjudanteAg", AjudanteAg);
	  	
	    /*
	    
	    GenericAgent BuscadorAg = new BuscadorAgente("BuscadorAg", this, null);
	    AgentRole BuscadorAgRole = new ProactiveAgentRole("BuscadorAgRole", MoodleOrg, BuscadorAg); 
	    addAgent("BuscadorAg", BuscadorAg);

	    
	    GenericAgent CoordenadorAg = new CoordenadorAgente("CoordenadorAg", this, null);
	    AgentRole CoordenadorAgRole = new ProactiveAgentRole("CoordenadorAg", MoodleOrg, CoordenadorAg); 
	    addAgent("CoordenadorAg", CoordenadorAg);
	    
	    
	    */
	    
	    
	    /* REGIAO RELACIONADA AS BEANS */
	    
	    gerenciadorCurso = new GerenciaCurso();
	 
	    mensagens = Collections.synchronizedList(new ArrayList<Mensagem>());
	    grupos = Collections.synchronizedList(new ArrayList<Grupo>());
	    alunosNotaBaixa = new HashMap<Curso, List<Aluno>>();
	    atividadesEncerrando = new HashMap<Aluno, List<Atividade>>();
	    
	    gerenciadorBeans = new GerenciadorBeans(gerenciadorCurso, this);
	    executorThread = Executors.newFixedThreadPool(1);
	    executorThread.execute(gerenciadorBeans);
	
	    
	
	}
	
	public GerenciadorBeans getGerenciadorBeans(){
		return gerenciadorBeans;
	}
	
	public GerenciaCurso getGerenciaCurso(){
		return gerenciadorCurso;
	}
	
	public void setMantemAgentesAtivos(boolean mantem){
		mantemAgentesAtivos = mantem;
	}
	
	public boolean getMantemAgentesAtivos(){
		return mantemAgentesAtivos;
	}
	
	public void addMensagem(Mensagem msg){
		getMensagens().add(msg);
	}
	
	public List<Mensagem> getMensagens(){
		return mensagens;
	}
	
	public List<Grupo> getGrupos(){
		return grupos;
	}
	
	public Map<Curso, List<Aluno>> getAlunosNotaBaixa(){
		return alunosNotaBaixa;
	}
	
	public void addAlunosNotaBaixa(Curso c, List<Aluno> als){
		getAlunosNotaBaixa().put(c, als);
	}
	
	public Map<Aluno, List<Atividade>> getAtividadesEncerrando(){
		return atividadesEncerrando;
	}
	
	public void addAtividadeEncerrando(Aluno al, List<Atividade> ats){
		getAtividadesEncerrando().put(al, ats);
	}
	
	
  
  
	public static void main(String args[]) {
		final MoodleEnv env = new MoodleEnv("MoodleEnv", "127.0.0.1", "8888");
		System.out.println("Executou");
		
		Runtime.getRuntime().addShutdownHook(new Thread(){
			
			public void run(){
				
				env.getGerenciadorBeans().setMantemAtualizando(false);
			}
		});
		
		
	}

}
